/*->h.flex */


#ifndef __flex_h
#define __flex_h

typedef void **flex_ptr;



#define FLEX_MAX -1
#define FLEX_NORESIZE (1<<7)



typedef struct flexblockstr
{
 char                * flex__freep;  /* free flex memory */
 char                * flex__lim;    /* limit of flex memory */
 char                * flex__base;
 int                   areano;
 int                   uses;
 int                   demon:1;
 int                   overhead;
 struct flexblockstr * next;
 struct flexblockstr * prev;

} flexblockstr;



typedef os_error * (*flex_lockfn)(int handle,int by);
typedef os_error * (*flex_panicfn)(int n);





extern osbool flex_alloca(flex_ptr anchor,int n,flexblockstr * fb);
extern osbool flex_freea(flex_ptr anchor,flexblockstr * fb);
extern osbool flex_extenda(flex_ptr anchor,int newsize,flexblockstr * fb);
extern osbool flex_midextenda(flex_ptr anchor,int at,int by,
                                                           flexblockstr * fb);
extern osbool flex_chunka(flex_ptr anchor,int size,int chunksize,
                                                           flexblockstr * fb);
extern osbool flex_createarea(flexblockstr ** fbp,int bits,int max,
                                                           char * name);
extern osbool flex_deletearea(flexblockstr * fb);

extern osbool flex_finit(void);



extern osbool flex_alloc(flex_ptr anchor,int n);
extern osbool flex_salloc(flex_ptr anchor,int n);
extern osbool flex_free(flex_ptr anchor);
extern osbool flex_size(flex_ptr anchor,int * size);
extern osbool flex_extend(flex_ptr anchor,int newsize);
extern osbool flex_midextend(flex_ptr anchor, int at, int by);
extern osbool flex_init(void);
extern osbool flex_chunk(flex_ptr anchor,int size,int chunksize);
extern void flex_setlock(flex_ptr anchor,flex_lockfn lockfn,int handle);
extern osbool flex_addpanic(flex_panicfn panic);
extern void flex_swop(flex_ptr anchor1,flex_ptr anchor2);

extern osbool flex_overheada(int overhead,flexblockstr * fb);
extern int        flex_getoverheada(flexblockstr * fb);
extern osbool flex_overhead(int overhead);
extern int        flex_getoverhead(void);


extern int        flex_freemem(void); /* for main slot only */




extern void flex_debug(flex_ptr anchor,int line);
extern int  flex_checka(flexblockstr * fb);
extern int  flex_check(void);


#define FLEXFREE(X) flex_free((flex_ptr)&(X))
#define FLEXALLOC(X,S) flex_alloc((flex_ptr)&(X),(S))
#define FLEXCALLOC(X,S) flex_salloc((flex_ptr)&(X),(S))
#define FLEXEXTEND(X,S) flex_extend((flex_ptr)&(X),(S))

#endif

